<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="theme-color" content="#0078E7"><meta name="author" content="yangbo.wang"><meta name="copyright" content="yangbo.wang"><meta name="generator" content="Hexo 5.3.0"><meta name="theme" content="hexo-theme-yun"><title>ORM简介 | Blog</title><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@900&amp;display=swap" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/star-markdown-css@0.1.22/dist/yun/yun-markdown.min.css"><script src="//at.alicdn.com/t/font_1140697_ed8vp4atwoj.js" async></script><script src="https://cdn.jsdelivr.net/npm/scrollreveal/dist/scrollreveal.min.js" defer></script><script>document.addEventListener("DOMContentLoaded", () => {
  [".post-card",".post-content img"].forEach((target)=> {
    ScrollReveal().reveal(target);
  })
});
</script><link rel="shortcut icon" type="image/svg+xml" href="/yun.svg"><link rel="mask-icon" href="/yun.svg" color="#0078E7"><link rel="alternate icon" href="/yun.ico"><link rel="preload" href="/css/hexo-theme-yun.css" as="style"><link rel="preload" href="/js/utils.js" as="script"><link rel="preload" href="/js/hexo-theme-yun.js" as="script"><link rel="prefetch" href="/js/sidebar.js" as="script"><link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin><script id="yun-config">
    const Yun = window.Yun || {};
    window.CONFIG = {"hostname":"example.com","root":"/","title":"你的月亮我的心","version":"1.4.0","mode":"dark","copycode":true,"page":{"isPost":true},"anonymous_image":"https://cdn.jsdelivr.net/gh/YunYouJun/cdn/img/avatar/none.jpg","say":{"api":"https://v1.hitokoto.cn","hitokoto":true},"fireworks":{"colors":["102, 167, 221","62, 131, 225","33, 78, 194"]}};
  </script><link rel="stylesheet" href="/css/hexo-theme-yun.css"><script src="/js/utils.js"></script><script src="/js/hexo-theme-yun.js"></script><meta name="description" content="ORM简介MVC框架中包括一个重要的部分，就是ORM，它实现了数据模型与数据库的解耦，即数据模型的设计不需要依赖于特定的数据库，通过简单的配置就可以轻松更换数据库  ORM是“对象-关系-映射”的简称，主要任务是： 根据对象的类型生成表结构  将对象、列表的操作，转换为sql语句  将sql查询到的结果转换为对象、列表  这极大的减轻了开发人员的工作量，不需要面对因数据库变更而导致的无效劳动  D">
<meta property="og:type" content="article">
<meta property="og:title" content="ORM简介">
<meta property="og:url" content="http://example.com/2021/01/17/Django%E6%A8%A1%E5%9E%8B/index.html">
<meta property="og:site_name" content="Blog">
<meta property="og:description" content="ORM简介MVC框架中包括一个重要的部分，就是ORM，它实现了数据模型与数据库的解耦，即数据模型的设计不需要依赖于特定的数据库，通过简单的配置就可以轻松更换数据库  ORM是“对象-关系-映射”的简称，主要任务是： 根据对象的类型生成表结构  将对象、列表的操作，转换为sql语句  将sql查询到的结果转换为对象、列表  这极大的减轻了开发人员的工作量，不需要面对因数据库变更而导致的无效劳动  D">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2021-01-17T07:12:04.115Z">
<meta property="article:modified_time" content="2021-01-17T07:29:53.772Z">
<meta property="article:author" content="yangbo.wang">
<meta property="article:tag" content="Django">
<meta property="article:tag" content="ORM">
<meta name="twitter:card" content="summary"><script src="/js/ui/mode.js"></script></head><body><script defer src="https://cdn.jsdelivr.net/npm/animejs@latest"></script><script defer src="/js/ui/fireworks.js"></script><canvas class="fireworks"></canvas><div class="container"><a class="sidebar-toggle hty-icon-button" id="menu-btn"><div class="hamburger hamburger--spin" type="button"><span class="hamburger-box"><span class="hamburger-inner"></span></span></div></a><div class="sidebar-toggle sidebar-overlay"></div><aside class="sidebar"><script src="/js/sidebar.js"></script><ul class="sidebar-nav"><li class="sidebar-nav-item sidebar-nav-toc hty-icon-button sidebar-nav-active" data-target="post-toc-wrap" title="Table of Contents"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-list-ordered"></use></svg></li><li class="sidebar-nav-item sidebar-nav-overview hty-icon-button" data-target="site-overview-wrap" title="Overview"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-passport-line"></use></svg></li></ul><div class="sidebar-panel" id="site-overview-wrap"><div class="site-info fix-top"><a class="site-author-avatar" href="/about/" title="yangbo.wang"><img width="96" loading="lazy" src="/Yun.png" alt="yangbo.wang"></a><div class="site-author-name"><a href="/about/">yangbo.wang</a></div><a class="site-name" href="/about/site.html">Blog</a><sub class="site-subtitle"></sub><div class="site-desciption"></div></div><nav class="site-state"><a class="site-state-item hty-icon-button icon-home" href="/" title="Home"><span class="site-state-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-home-4-line"></use></svg></span></a><div class="site-state-item"><a href="/archives/" title="Archives"><span class="site-state-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-archive-line"></use></svg></span><span class="site-state-item-count">8</span></a></div><div class="site-state-item"><a href="/categories/" title="Categories"><span class="site-state-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-folder-2-line"></use></svg></span><span class="site-state-item-count">2</span></a></div><div class="site-state-item"><a href="/tags/" title="Tags"><span class="site-state-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-price-tag-3-line"></use></svg></span><span class="site-state-item-count">9</span></a></div><a class="site-state-item hty-icon-button" href="/" title="文档"><span class="site-state-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-settings-line"></use></svg></span></a></nav><hr style="margin-bottom:0.5rem"><div class="links-of-author"><a class="links-of-author-item hty-icon-button" rel="noopener" title="微信 A18309169837" target="_blank" style="color:orange"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-wechat-2-line"></use></svg></a><a class="links-of-author-item hty-icon-button" rel="noopener" title="QQ  1197213754" target="_blank" style="color:#12B7F5"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-qq-line"></use></svg></a><a class="links-of-author-item hty-icon-button" rel="noopener" href="https://gitee.com/wyb_001" title="GitHub" target="_blank" style="color:#6e5494"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-github-line"></use></svg></a><a class="links-of-author-item hty-icon-button" rel="noopener" title="E-Mail 1197213754@qq.com" target="_blank" style="color:#8E71C1"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-mail-line"></use></svg></a></div><hr style="margin:0.5rem 1rem"><div class="links"><a class="links-item hty-icon-button" href="/about/" title="关于我" style="color:dodgerblue"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-genderless-line"></use></svg></a></div></div><div class="sidebar-panel sidebar-panel-active" id="post-toc-wrap"><div class="post-toc"><div class="post-toc-content"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#ORM%E7%AE%80%E4%BB%8B"><span class="toc-number">1.</span> <span class="toc-text">ORM简介</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BD%BF%E7%94%A8mysql%E6%95%B0%E6%8D%AE%E5%BA%93"><span class="toc-number">2.</span> <span class="toc-text">使用mysql数据库</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%AE%9A%E4%B9%89%E6%A8%A1%E5%9E%8B"><span class="toc-number">3.</span> <span class="toc-text">定义模型</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7"><span class="toc-number">3.0.1.</span> <span class="toc-text">定义属性</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AD%97%E6%AE%B5%E7%B1%BB%E5%9E%8B"><span class="toc-number">3.0.2.</span> <span class="toc-text">字段类型</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AD%97%E6%AE%B5%E9%80%89%E9%A1%B9"><span class="toc-number">3.0.3.</span> <span class="toc-text">字段选项</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%85%B3%E7%B3%BB"><span class="toc-number">3.0.4.</span> <span class="toc-text">关系</span></a></li></ol></li></ol></li></ol></div></div></div></aside><main class="sidebar-translate" id="content"><div id="post"><article class="post-block" itemscope itemtype="https://schema.org/Article"><link itemprop="mainEntityOfPage" href="http://example.com/2021/01/17/Django%E6%A8%A1%E5%9E%8B/"><span hidden itemprop="author" itemscope itemtype="https://schema.org/Person"><meta itemprop="name" content="yangbo.wang"><meta itemprop="description"></span><span hidden itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><meta itemprop="name" content="Blog"></span><header class="post-header"><h1 class="post-title" itemprop="name headline">ORM简介</h1><div class="post-meta"><div class="post-time" style="display:inline-block"><span class="post-meta-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-calendar-line"></use></svg></span> <time title="Created: 2021-01-17 15:12:04" itemprop="dateCreated datePublished" datetime="2021-01-17T15:12:04+08:00">2021-01-17</time></div><div class="post-classify"><span class="post-category"> <span class="post-meta-item-icon" style="margin-right:3px;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-folder-line"></use></svg></span><span itemprop="about" itemscope itemtype="https://schema.org/Thing"><a class="category" href="/categories/Python/" style="--text-color:var(--hty-text-color)" itemprop="url" rel="index"><span itemprop="text">Python</span></a></span></span><span class="post-tag"><span class="post-meta-divider">-</span><a class="tag" href="/tags/Django/" style="--text-color:var(--hty-text-color)"><span class="post-meta-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-price-tag-3-line"></use></svg></span><span class="tag-name">Django</span></a><a class="tag" href="/tags/ORM/" style="--text-color:var(--hty-text-color)"><span class="post-meta-item-icon"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-price-tag-3-line"></use></svg></span><span class="tag-name">ORM</span></a></span></div></div></header><section class="post-body" itemprop="articleBody"><div class="post-content markdown-body" style="--smc-primary:#0078E7;"><h2 id="ORM简介"><a href="#ORM简介" class="headerlink" title="ORM简介"></a>ORM简介</h2><pre><code>MVC框架中包括一个重要的部分，就是ORM，它实现了数据模型与数据库的解耦，即数据模型的设计不需要依赖于特定的数据库，通过简单的配置就可以轻松更换数据库 
ORM是“对象-关系-映射”的简称，主要任务是：
根据对象的类型生成表结构 
将对象、列表的操作，转换为sql语句 
将sql查询到的结果转换为对象、列表 
这极大的减轻了开发人员的工作量，不需要面对因数据库变更而导致的无效劳动 
Django中的模型包含存储数据的字段和约束，对应着数据库中唯一的表 </code></pre>
<h2 id="使用mysql数据库"><a href="#使用mysql数据库" class="headerlink" title="使用mysql数据库"></a>使用mysql数据库</h2><pre><code>1:在虚拟环境中安装mysql包
      pip install pymysql
2:在mysql中创建数据库 
      create databases test2 charset=utf8
3:打开settings.py文件，修改DATABASES项 
    DATABASES = &#123;
      &#39;default&#39;: &#123;
          &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;,
          &#39;NAME&#39;: &#39;test2&#39;,
          &#39;USER&#39;: &#39;用户名&#39;,
          &#39;PASSWORD&#39;: &#39;密码&#39;,
          &#39;HOST&#39;: &#39;数据库服务器ip，本地可以使用localhost&#39;,
          &#39;PORT&#39;: &#39;端口，默认为3306&#39;,
      &#125;
  &#125;  </code></pre>
<h2 id="定义模型"><a href="#定义模型" class="headerlink" title="定义模型"></a>定义模型</h2><pre><code>在模型中定义属性，会生成表中的字段 
django根据属性的类型确定以下信息： 
当前选择的数据库支持字段的类型 
渲染管理表单时使用的默认html控件 
在管理站点最低限度的验证 
django会为表增加自动增长的主键列，每个模型只能有一个主键列，如果使用选项设置某属性为主键列后，则django不会再生成默认的主键列 
属性命名限制 
不能是python的保留关键字
由于django的查询方式，不允许使用连续的下划线 </code></pre>
<h4 id="定义属性"><a href="#定义属性" class="headerlink" title="定义属性"></a>定义属性</h4><pre><code>定义属性时，需要字段类型 
字段类型被定义在django.db.models.fields目录下，为了方便使用，被导入到django.db.models中 
使用方式
1.导入from django.db import models
2.通过models.Field创建字段类型的对象，赋值给属性 
对于重要数据都做逻辑删除，不做物理删除，实现方法是定义isDelete属性，类型为BooleanField，默认值为False</code></pre>
<h4 id="字段类型"><a href="#字段类型" class="headerlink" title="字段类型"></a>字段类型</h4><pre><code>AutoField：一个根据实际ID自动增长的IntegerField，通常不指定 
如果不指定，一个主键字段将自动添加到模型中 
BooleanField：true/false 字段，此字段的默认表单控制是CheckboxInput 
NullBooleanField：支持null、true、false三种值 
CharField(max_length=字符长度)：字符串，默认的表单样式是 TextInput 
TextField：大文本字段，一般超过4000使用，默认的表单控件是Textarea 
IntegerField：整数 
DecimalField(max_digits=None, decimal_places=None)：使用python的Decimal实例表示的十进制浮点数 
DecimalField.max_digits：位数总数 
DecimalField.decimal_places：小数点后的数字位数 
FloatField：用Python的float实例来表示的浮点数 
DateField[auto_now=False, auto_now_add=False])：使用Python的datetime.date实例表示的日期 
参数DateField.auto_now：每次保存对象时，自动设置该字段为当前时间，用于&quot;最后一次修改&quot;的时间戳，它总是使用当前日期，默认为false 
参数DateField.auto_now_add：当对象第一次被创建时自动设置当前时间，用于创建的时间戳，它总是使用当前日期，默认为false 
该字段默认对应的表单控件是一个TextInput. 在管理员站点添加了一个JavaScript写的日历控件，和一个“Today“的快捷按钮，包含了一个额外的invalid_date错误消息键 
auto_now_add, auto_now, and default 这些设置是相互排斥的，他们之间的任何组合将会发生错误的结果 
TimeField：使用Python的datetime.time实例表示的时间，参数同DateField 
DateTimeField：使用Python的datetime.datetime实例表示的日期和时间，参数同DateField 
FileField：一个上传文件的字段 
ImageField：继承了FileField的所有属性和方法，但对上传的对象进行校验，确保它是个有效的image </code></pre>
<h4 id="字段选项"><a href="#字段选项" class="headerlink" title="字段选项"></a>字段选项</h4><pre><code>通过字段选项，可以实现对字段的约束 
在字段对象时通过关键字参数指定 
null：如果为True，Django 将空值以NULL 存储到数据库中，默认值是 False 
blank：如果为True，则该字段允许为空白，默认值是 False 
对比：null是数据库范畴的概念，blank是表单验证证范畴的 
db_column：字段的名称，如果未指定，则使用属性的名称 
db_index：若值为 True, 则在表中会为此字段创建索引 
default：默认值 
primary_key：若为 True, 则该字段会成为模型的主键字段 
unique：如果为 True, 这个字段在表中必须有唯一值 </code></pre>
<h4 id="关系"><a href="#关系" class="headerlink" title="关系"></a>关系</h4><pre><code>关系的类型包括 
ForeignKey：一对多，将字段定义在多的端中 
ManyToManyField：多对多，将字段定义在两端中 
OneToOneField：一对一，将字段定义在任意一端中 
可以维护递归的关联关系，使用&#39;self&#39;指定，详见“自关联” 
用一访问多：对象.模型类小写_set</code></pre>
</div><ul class="post-copyright"><li class="post-copyright-author"><strong>Post author: </strong>yangbo.wang</li><li class="post-copyright-link"><strong>Post link: </strong><a href="http://example.com/2021/01/17/Django%E6%A8%A1%E5%9E%8B/" title="ORM简介">http://example.com/2021/01/17/Django%E6%A8%A1%E5%9E%8B/</a></li><li class="post-copyright-license"><strong>Copyright Notice: </strong>All articles in this blog are licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank" rel="noopener" title="CC BY-NC-SA 4.0 "><svg class="icon"><use xlink:href="#icon-creative-commons-line"></use></svg><svg class="icon"><use xlink:href="#icon-creative-commons-by-line"></use></svg><svg class="icon"><use xlink:href="#icon-creative-commons-nc-line"></use></svg><svg class="icon"><use xlink:href="#icon-creative-commons-sa-line"></use></svg></a> unless otherwise stated.</li></ul></section></article><div class="post-nav"><div class="post-nav-item"><a class="post-nav-prev" href="/2021/01/17/django%20%E6%A8%A1%E5%9E%8B%E6%9F%A5%E8%AF%A2/" rel="prev" title="模型查询"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-arrow-left-s-line"></use></svg><span class="post-nav-text">模型查询</span></a></div><div class="post-nav-item"><a class="post-nav-next" href="/2021/01/17/django%E6%A8%A1%E6%9D%BF/" rel="next" title="Django模板介绍"><span class="post-nav-text">Django模板介绍</span><svg class="icon" aria-hidden="true"><use xlink:href="#icon-arrow-right-s-line"></use></svg></a></div></div></div></main><footer class="sidebar-translate" id="footer"><div class="copyright"><span>&copy; 2019 – 2021 </span><span class="with-love" id="animate"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-cloud-line"></use></svg></span><span class="author"> yangbo.wang</span></div><div class="powered"><span>Powered by <a href="https://hexo.io" target="_blank" rel="noopener">Hexo</a> v5.3.0</span><span class="footer-separator">|</span><span>Theme - <a rel="noopener" href="https://github.com/YunYouJun/hexo-theme-yun" target="_blank"><span>Yun</span></a> v1.4.0</span></div></footer><a class="hty-icon-button" id="goUp" aria-label="back-to-top" href="#"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-arrow-up-s-line"></use></svg><svg class="progress-circle-container" viewBox="0 0 100 100"><circle class="progress-circle" id="progressCircle" cx="50" cy="50" r="48" fill="none" stroke="#0078E7" stroke-width="2" stroke-linecap="round"></circle></svg></a></div></body></html>